#include <bits/stdc++.h>
using namespace std;

const int maxl = 1e5 + 10;

int n, k, cnt, ans, lim;
long long sum;

long long dis[maxl];
bool in[maxl];
int num[maxl];

struct edge
{
    int to;
    int weight;
};

vector<edge> e[maxl];

queue<int> q;

inline void add(int u, int v, int l)
{
    e[u].push_back({v, l});
}

inline void prework()
{
    ans = 1;
    scanf("%d%d", &n, &k);
    int op, a, b;
    for (int i = 1; i <= k; i++)
    {
        scanf("%d%d%d", &op, &a, &b);
        if (op == 1)
            add(b, a, 0), add(a, b, 0);
        if (op == 2)
            add(a, b, 1);
        if (op == 3)
            add(b, a, 0);
        if (op == 4)
            add(b, a, 1);
        if (op == 5)
            add(a, b, 0);
        if (op % 2 == 0 && a == b)
            ans = 0;
    }
}

inline bool spfa(int st)
{
    int u, v;
    q.push(st);
    dis[st] = 1;
    in[st] = true;
    while (!q.empty())
    {
        u = q.front();
        q.pop();
        for (int i = 0; i<e[u].size();i++)
        {
            v = e[u][i].to;

            if (dis[u] + e[u][i].weight > dis[v])
            {
                dis[v] = dis[u] + e[u][i].weight;

                if (!in[v])
                {
                    q.push(v);
                    num[v]++;
                    in[v] = true;
                    if (num[v] >= n)
                        return false;
                }
            }
        }
        in[u] = false;
    }
    return true;
}

inline void mainwork()
{
    if (ans == 0)
        return;
    for (int i = 1; i <= n; i++)
        if (dis[i] == 0)
        {
            if (!spfa(i))
            {
                ans = 0;
                return;
            }
        }
    for (int i = 1; i <= n; i++)
        sum += dis[i];
}

inline void print()
{
    if (!ans)
        puts("-1");
    else
        printf("%lld", sum);
}

int main()
{
    // freopen("in.in","r",stdin);
    prework();
    mainwork();
    print();
    return 0;
}